<?php
	if (!class_exists('MyDebuger'))
		die('Se requiere de la clase \'MyDebuger\' para utilizar la clase \'Bytes\'');
		
	final class Bytes extends MyDebuger {
		/* atributo con los posibles valores */
		private $types		= Array('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB', 'GeB');
		/* valor a convertir */
		private $bytes		= 0;
		/* resultado final */
		private $result	= '';
		/* temporal */
		private $counter	= 0;
		
		/* constructor */
		public function __construct($nombre = 'Bytes') {
			/* creamos el padre */
			parent::__construct($nombre);
		}
		
		/* destructor */
		public function __destruct() {
			/* mostramos un mensaje */
			$this->show('Vaciando memoria..', False);
			/* matamos el padre */
			parent::__destruct();
			/* mostramos OK */
			$this->showOK();
		}
		
		/* Metodo estatico para realizar la conversion */
		public static function convert($bytes) {
			/* creamos el objeto */
			$conv = new Bytes();
			/* convertimos la cantidad y la devolvemos */
			return $conv->convertir($bytes);
		}
		
		public function convertir($bytes) {
			/* almacenamos el valor */
			$this->almacenar($bytes);
			/* convertimos el valor */
			$this->convertirCantidad();
			/* retornamos el valor convertido */
			return $this->result;
		}
		
		private function almacenar($bytes) {
			/* mostramos un mensaje */
			$this->show('Almacenando valor..', False);
			/* guardamos el valor a convertir */
			$this->bytes = $bytes;
			/* mostramos OK al mensaje */
			$this->showOK();
		}
		
		private function convertirCantidad() {
			/* dividimos el numero */
			$this->dividir();
			/* realizamos el formateo del numero */
			$this->formatear();
			/* agregamos la sigla de tamano */
			$this->agregarSigla();
		}
		
		private function dividir() {
			/* mostramos un mensaje */
			$this->show('Realizando reduccion de cantidad..', False);
			/* recorro el valor hasta que no se pueda dividir por 1024 */
			for (
				$this->counter = 0;
				$this->bytes >= 1024 && $this->counter < (count($this->types) - 1);
				$this->bytes /= 1024, $this->counter++
			);
			/* mostramos OK al mensaje */
			$this->showOK();
		}
		
		private function formatear() {
			/* mostramos un mensaje */
			$this->show('Formateando cantidad..', False);
			/* formateamos el numero asignandole dos decimales */
			$this->result = number_format($this->bytes, ($this->counter == 0 ? 0 : 2), ",", ".");
			/* mostramos OK al mensaje */
			$this->showOK();
		}
		
		private function agregarSigla() {
			/* mostramos un mensaje */
			$this->show('Agregando sigla..', False);
			if ($this->counter != 0 || $this->result != 1)
				/* agregamos la sigla */
				$this->result .= ' ' . $this->types[$this->counter];
			elseif ($this->result == 1)
				/* si el resultado es 1 (uno) agregamos la sigla 'Bytes' sin la ese */
				$this->result .= ' ' . substr($this->types[$this->counter], 0, -1);
			/* mostramos OK al mensaje */
			$this->showOK();
		}
	}
?>